package com.lry.basic.nio;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

/**
 * @author:刘仁有
 * @desc:
 * @email:953506233@qq.com
 * @data:2019/9/9
 */
public class Demo1 {
//    使用Buffer读写数据一般遵循以下四个步骤：
//    写入数据到Buffer
//    调用flip()方法
//    从Buffer中读取数据
//    调用clear()方法或者compact()方法
//
//    当向buffer写入数据时，buffer会记录下写了多少数据。
//    一旦要读取数据，需要通过flip()方法将Buffer从写模式切换到读模式。
//    在读模式下，可以读取之前写入到buffer的所有数据。
//
//    一旦读完了所有的数据，就需要清空缓冲区，让它可以再次被写入。
//    有两种方式能清空缓冲区：调用clear()或compact()方法。
//    clear()方法会清空整个缓冲区。
//    compact()方法只会清除已经读过的数据。
//    任何未读的数据都被移到缓冲区的起始处，新写入的数据将放到缓冲区未读数据的后面。
    public static void main(String[] args) throws IOException {
        RandomAccessFile file = new RandomAccessFile("D:\\1.txt","rw");
        FileChannel channel = file.getChannel();//文件通道
        ByteBuffer buf = ByteBuffer.allocate(16);

        int read = channel.read(buf);//从channel读到buf
        while(read!=-1){
            buf.flip();//切换读模式
            while(buf.hasRemaining()){
                System.out.print((char)buf.get());
            }
            buf.clear();
            read = channel.read(buf);
        }
        file.close();
    }
}
